package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanCategoriaPro;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanProdottiFattura;
import it.azienda.managerworkstandard.modello.BeanProdotto;
import it.azienda.managerworkstandard.modello.BeanProdottoDett;
import it.azienda.managerworkstandard.modello.BeanReparto;
import java.util.ArrayList;
import java.util.HashMap;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlForm;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class DettaglioProdotto extends Dettaglio{
    
    public DettaglioProdotto() {  }
    
    private BeanProdotto beanProdotto;
    private HtmlForm form = new HtmlForm();
    private ArrayList listaProdottoDet=new ArrayList();
    
    public void setBeanProdotto(BeanProdotto beanProdotto) {
        setObj(beanProdotto);
        this.beanProdotto = beanProdotto;
    }
    
    public BeanProdotto getBeanProdotto(){
        return (BeanProdotto)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanProdotto =(BeanProdotto) ctx.getExternalContext().getRequestMap().get("beanProdotto");
        controlloDopoSalvataggio(beanProdotto);
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void caricaStoricoProdotto(Integer idProdotto, Integer tab){
        FacesContext ctx = FacesContext.getCurrentInstance();
        DettaglioProdotto dettaglio=(DettaglioProdotto) ctx.getApplication().getVariableResolver().resolveVariable(ctx, "dettaglioProdotto");
        
        BeanLogin login=(BeanLogin)Utilita.getSession().getAttribute("login");
        
        Query q=null;
        String query="";
        if(tab.intValue()==1){
            // Prodotto Dett
            query="select proDett from BeanProdottoDett proDett,BeanProdotto prodotto" +
                    " where prodotto.id = :id" +
                    " and proDett.beanProdotto.id = prodotto.id" ;
            if(login.getOrdineProd().equals("C")){
                query += " order by proDett.codice, proDett.descrizioneBreve";
            }else{
                query += " order by proDett.descrizioneBreve, proDett.codice ";
            }
        }
        try {
            Session sessione = DAOConnectionSingleton.newSession();
            
            DAOConnectionSingleton.beginTransaction();
            q = sessione.createQuery(query);
            q.setInteger("id", idProdotto.intValue());
            ArrayList lista = (ArrayList) q.list();
            DAOConnectionSingleton.commitTransaction();
            
            if(lista.size()!=0){
                if(tab.intValue()==1){
                    dettaglio.setListaProdottoDet(lista);
                    login.settaHashMapStorico(lista);
                    Utilita.getSession().removeAttribute("login");
                    Utilita.getSession().setAttribute("login",login);
                }
                Utilita.getRequest().setAttribute("dettaglioProdotto",dettaglio);
            }else{
                Utilita.getSession().removeAttribute("login");
                login.setListaStorico(new HashMap());
                Utilita.getSession().setAttribute("login",login);
            }
        } catch (Exception e) {
            
        } finally {
            DAOConnectionSingleton.closeSession();
        }
    }
    
    public void lookUp(ValueChangeEvent event) {
        
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanProdotto =(BeanProdotto) ctx.getExternalContext().getRequestMap().get("beanProdotto");
        setObj(beanProdotto);
        String descrizione=new String(""+event.getNewValue());
        
        String nomeBean=(String)event.getComponent().getAttributes().get("nomeBean");
        String nomeBeanLookUp =(String)event.getComponent().getAttributes().get("nomeBeanLookUp");
        
        if(nomeBean.equals("beanCategoriaPro")){
            Session sessione = DAOConnectionSingleton.newSession();
            BeanCategoriaPro categoria=(BeanCategoriaPro)sessione.createQuery("select beanCategoriaPro from BeanCategoriaPro beanCategoriaPro where codice = "+descrizione)
            .uniqueResult();
            if (categoria == null) {
                ((HtmlInputText) form.findComponent("descrizioneCategoriaPro")).setSubmittedValue(null);
                ((HtmlInputText) form.findComponent("codiceCategoriaPro")).setSubmittedValue(null);
                beanProdotto.setBeanCategoriaPro(new BeanCategoriaPro());
                setObj(beanProdotto);
                HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
                form.setRendered(true);
                ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","Categoria inesistente"));
            } else {
                beanProdotto.setBeanCategoriaPro(categoria);
                setObj(beanProdotto);
                ((HtmlInputText) form.findComponent("descrizioneCategoriaPro")).setSubmittedValue(categoria.getDescrizione());
            }
        }
        
        if(nomeBean.equals("beanReparto")){
            Session sessione = DAOConnectionSingleton.newSession();
            BeanReparto categoria=(BeanReparto)sessione.createQuery("select reparto from BeanReparto reparto where codice = "+descrizione)
            .uniqueResult();
            if (categoria == null) {
                ((HtmlInputText) form.findComponent("descrizioneReparto")).setSubmittedValue(null);
                ((HtmlInputText) form.findComponent("codiceReparto")).setSubmittedValue(null);
                beanProdotto.setBeanReparto(new BeanReparto());
                setObj(beanProdotto);
                HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
                form.setRendered(true);
                ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase","Reparto inesistente"));
            } else {
                beanProdotto.setBeanReparto(categoria);
                setObj(beanProdotto);
                ((HtmlInputText) form.findComponent("descrizioneReparto")).setSubmittedValue(categoria.getDescrizione());
            }
        }
        setObj(beanProdotto);
        ctx.renderResponse();
    }
    
    
    public void primaInserimento(Object obj) {
        String query=" select max(prod.codice) from BeanProdotto prod";
        Session session = null;
        Transaction tr = null;
        try {
            session = DAOConnectionSingleton.newSession();
            tr = session.beginTransaction();
            Query q = null;
            q = session.createQuery(query);
            ArrayList listaCodice = (ArrayList) q.list();
            Integer cod=(Integer) listaCodice.get(0);
            if(cod!=null){
                this.beanProdotto.setCodice(new Integer(cod.intValue()+1));
            }else{
                this.beanProdotto.setCodice(new Integer(1));
            }
        } catch (Exception e) {
        }
    }
    
   /*
    public void primaModifica(){
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanProdotto =(BeanProdotto) ctx.getExternalContext().getRequestMap().get("beanProdotto");
        String query=" select prod from BeanProdotto prod where prod.id = :id";
        Session session = null;
        try {
            session = DAOConnectionSingleton.newSession();
            DAOConnectionSingleton.beginTransaction();
            Query q = null;
            q = session.createQuery(query);
            BeanProdotto prod = (BeanProdotto) q.setInteger("id",beanProdotto.getId().intValue()).uniqueResult();
            DAOConnectionSingleton.commitTransaction();
            if(!prod.getSigla().equals(beanProdotto.getSigla())){
                query=" select prodDett from BeanProdottoDett prodDett" +
                        " where prodDett.beanProdotto.sigla = :sigla" +
                        " order by prodDett.codice";
    
                DAOConnectionSingleton.beginTransaction();
                q = session.createQuery(query);
                ArrayList lista = (ArrayList) q.setString("sigla",prod.getSigla()).list();
                DAOConnectionSingleton.commitTransaction();
                for(int i=0;i<lista.size();i++){
                    BeanProdottoDett beanProdottoDett= (BeanProdottoDett)lista.get(i);
                    String nuovoCod=beanProdotto.getSigla();
                    if(i < 10){
                        nuovoCod+="000"+i;
                    }else if(i < 100){
                        nuovoCod+="00"+i;
                    }else if(i < 1000){
                        nuovoCod+="0"+i;
                    }else{
                        nuovoCod+=""+i;
                    }
                    beanProdottoDett.setCodice(nuovoCod);
                    beanProdottoDett.modifica();
                    session.flush();
                }
            }
        } catch (Exception e) {
        }finally {
            DAOConnectionSingleton.closeSession();
        }
    }
    */
    
    public ArrayList getListaProdottoDet() {
        return listaProdottoDet;
    }
    
    public void setListaProdottoDet(ArrayList listaProdottoDet) {
        this.listaProdottoDet = listaProdottoDet;
    }
    public boolean controlliPrimaSalvataggio() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanProdotto =(BeanProdotto) ctx.getExternalContext().getRequestMap().get("beanProdotto");
        boolean errori = false;
        if(beanProdotto.getBeanCategoriaPro().getId() == null) {
            HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("Attenzione: Codice Iva Obbligatorio!"));
            errori = true;
        }
        
        if(beanProdotto.getBeanReparto().getId() == null) {
            HtmlForm form = (HtmlForm)ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("Attenzione: Reparto Obbligatorio!"));
            errori = true;
        }
        
        if(errori) {
            controlloDopoSalvataggio(beanProdotto);
            return true;
        }
        return false;
    }
    
    public void controlloDopoSalvataggio(Object obj) {
        BeanProdotto prodotto=(BeanProdotto)obj;
        if(prodotto.getBeanCategoriaPro()==null){
            prodotto.setBeanCategoriaPro(new BeanCategoriaPro());
        }
        if(prodotto.getBeanReparto()==null){
            prodotto.setBeanReparto(new BeanReparto());
        }
        BeanLogin login=(BeanLogin)Utilita.getSession().getAttribute("login");
        login.settaHashMapStorico(new ArrayList());
        Utilita.getSession().removeAttribute("login");
        Utilita.getSession().setAttribute("login",login);
    }
    
}
